package JackSu.java01;

import java.time.LocalDate;

public class Generic<T> {//在虚拟机中会进行类型擦除为Object，然后强制转换泛型类型

    private T first;
    private T second;

    public T getFirst() {
        return first;
    }

    public void setFirst(T first) {
        this.first = first;
    }

    public T getSecond() {
        return second;
    }

    public void setSecond(T second) {
        this.second = second;
    }

    class GenericImpl extends Generic<LocalDate> {

        @Override
        public LocalDate getFirst() {
            return super.getFirst();
        }

        //该继承父类的方法，在虚拟机中，对父类进行类型擦除后父类方法啊参数为Object，这样该方法就不能构成重写
        //解决办法是编译器生成一个桥方法，强制转换并指向该方法。在编写的时候具有两个相同参数的方法是不通过的，
        // 但是在虚拟机中是用参数类型和返回类型确定一个方法
        //clone方法被称为具有协变的返回类型，实际上它就是使用了桥方法
        @Override
        public void setFirst(LocalDate first) {
            super.setFirst(first);
        }

/*    public void setFirst(Object first) {
        setFirst((LocalDate) first);
    }*/
    }
}
//虚拟机没有泛型，只有普通的类和方法
//所有的类型参数都用他们的限定类型转换
//桥方法被合成来保持多态
//为保持类型安全性，必要时插入强制类型转换
